在維護系統資料時,我遇到需要將 ATT_LEAVECODE
資料表中 REMARK
欄位的特定字串批次更新,例如把 "-阿民"
全部移除,並將 "#1234"
改成 "#6789"
。
最簡單的做法是使用 REPLACE()
函數:
UPDATE ATT_LEAVECODE
SET REMARK = REPLACE(REPLACE(REMARK, '-阿民', ''), '#1234', '#6789');
但為了避免誤改整張表,我會先分三步:
SELECT * FROM ATT_LEAVECODE
WHERE REMARK LIKE '%-阿民%' OR REMARK LIKE '%#1234%';
SELECT REMARK AS OLD_REMARK,
REPLACE(REPLACE(REMARK, '-阿民', ''), '#1234', '#6789') AS NEW_REMARK
FROM ATT_LEAVECODE
WHERE REMARK LIKE '%-阿民%' OR REMARK LIKE '%#1234%';
UPDATE ATT_LEAVECODE
SET REMARK = REPLACE(REPLACE(REMARK, '-阿民', ''), '#1234', '#6789')
WHERE REMARK LIKE '%-阿民%' OR REMARK LIKE '%#1234%';
COMMIT;
我遇到一個狀況,要比對某張資料表多出來2筆資料內容是什麼?
SELECT MODU_ID FROM SYS_MODULE ORDER BY MODU_ID;
將結果複製下來並格式化成:
'M001', 'M002', 'M005'
SELECT MODU_ID FROM SYS_MODULE
WHERE MODU_ID NOT IN ('M001', 'M002', 'M005')
ORDER BY MODU_ID;
💡 小技巧:
diff
工具比對。在 SQL Developer、PL/SQL Developer、Toad 等工具中:
Ctrl + F7
(SQL Developer)SELECT 'IN (' || LISTAGG('''' || MODU_ID || '''', ', ')
WITHIN GROUP (ORDER BY MODU_ID) || ')' AS in_clause
FROM SYS_MODULE;
方法 | 優點 | 缺點 | 適用情境 |
---|---|---|---|
變數暫存比對 | 不需權限、直接用 SQL 完成 | 手動複製清單、長度有限 | 權限受限、資料量不大 |
請幫我產生一段 Oracle SQL,可以在更新資料前先查詢並顯示修改前後差異,再由我決定是否 COMMIT。